package com.taotao.sso.service;

import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.CookieUtils;
import com.taotao.common.utils.JsonUtils;
import com.taotao.mapper.TbUserMapper;
import com.taotao.pojo.TbUser;
import com.taotao.pojo.TbUserExample;
import com.taotao.pojo.TbUserExample.Criteria;
import com.taotao.sso.component.JedisClient;

@Service
public class LoginServiceImpl implements LoginService {
	@Autowired
	private TbUserMapper tbUserMapper;
	@Autowired
	private JedisClient jedisClient;
	@Value("${REDIS_SESSION_KEY}")
	private String REDIS_SESSION_KEY;
	@Value("${REDIS_SESSION_EXPIRE}")
	private int REDIS_SESSION_EXPIRE;

	/**
	 * 登录服务
	 */
	@Override
	public TaotaoResult login(String username, String password,
			HttpServletRequest request, HttpServletResponse response) {
		// 从数据库获取信息
		TbUserExample example = new TbUserExample();
		Criteria criteria = example.createCriteria();
		criteria.andUsernameEqualTo(username);
		List<TbUser> list = tbUserMapper.selectByExample(example);
		// 校验用户名是否存在
		if (list == null || list.isEmpty()) {
			return TaotaoResult.build(400, "用户名或密码错误");
		}
		// 校验密码是否正确
		TbUser user = list.get(0);
		if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(
				user.getPassword())) {
			return TaotaoResult.build(400, "用户名或密码错误");
		}

		// 创建一个token
		String token = UUID.randomUUID().toString();
		// 将用户信息加入redis缓存
		// 安全:清空redis用户信息中的密码
		user.setPassword(null);
		jedisClient.set(REDIS_SESSION_KEY + ":" + token,
				JsonUtils.objectToJson(user));
		// 设置session过期时间
		jedisClient.expire(REDIS_SESSION_KEY + ":" + token,
				REDIS_SESSION_EXPIRE);
		// 设置cookie和过期时间
		CookieUtils.setCookie(request, response, "TT_TOKEN", token);
		return TaotaoResult.ok(token);
	}

	/**
	 * 根据token获取用户信息,并刷新用户信息过期时间,证明用户是活动的
	 */
	@Override
	public TaotaoResult getUserByToken(String token) {
		String json = jedisClient.get(REDIS_SESSION_KEY + ":" + token);
		if (StringUtils.isBlank(json)) {
			return TaotaoResult.build(400, "用户信息已过期,请重新登录");
		}
		TbUser user = JsonUtils.jsonToPojo(json, TbUser.class);
		// 刷新设置session过期时间
		jedisClient.expire(REDIS_SESSION_KEY + ":" + token,
				REDIS_SESSION_EXPIRE);
		return TaotaoResult.ok(user);
	}

	/**
	 * 安全退出用户登录,并删除缓存中用户信息
	 */
	@Override
	public TaotaoResult logout(String token, HttpServletRequest request,
			HttpServletResponse response) {
		String json = jedisClient.get(REDIS_SESSION_KEY + ":" + token);
		if (StringUtils.isBlank(json)) {
			return TaotaoResult.build(400, "退出失败,当前用户信息不存在");
		}
		jedisClient.expire(REDIS_SESSION_KEY + ":" + token, 0);
		// 退出同时删除token
		return TaotaoResult.ok();
	}
}
